//
//  FXUserAccountViewModel.swift
//  微博(Swift)
//
//  Created by V on 16/1/1.
//  Copyright © 2016年 V. All rights reserved.
//

import UIKit

class FXUserAccountViewModel: NSObject {
    // 用户信息模型
    var userAccount: FXUserAccount?
    // 单例方法
    static let sharedViewModel: FXUserAccountViewModel = FXUserAccountViewModel()
    
    override init() {
        super.init()
        userAccount = self.getUserAccoun()
    }

    
    private var archivePath = (NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).first! as NSString).stringByAppendingPathComponent("useraccount.archive")
    
    
    
    // 判断用户登录逻辑
    // 用户是否登录
    var userLogin: Bool {
        // 判断 accessToken 是否为空 && 没有过期？？
        if accessToken != nil && isExpiresIn == false {
            // 返回 true 代表当前是登录状态
            return true
        }
        return false
    }

    
    // 当前用户的 accessToken
    // 以后请求接口都需要用到 accessToken，所以抽取一个 getOnly 属性
    var accessToken: String? {
        return userAccount?.access_token
    }
    
    // 判断账户是否过期
    // isExpiresIn 是否过期，如果是true代表过期，false 代表不过期
    var isExpiresIn: Bool {
        // 1. 必须知道当前账户的 accessToken 的过期时间
        if let expiresDate = userAccount?.expiresDate {
            
            // 2. 拿着第1步求出的过期时间与当前时间进行对比
            let nowDate = NSDate()
            
            //======= 以下是测试代码 =======//
            // expiresDate = nowDate.dateByAddingTimeInterval(-1)
            //======= 以上是测试代码 =======//
            // print(expiresDate)
            // 3. 如果当前时间比过期时间小 --> 就代表没有过期
            if nowDate.compare(expiresDate) == .OrderedAscending {
                // 没有过期，返回false
                return false
            }
        }
        return true
    }
    
    // 获取AccessToken
    func loadAccessToken(code: String,completed: (isSuccess: Bool) ->()){
        // 请求地址
        let urlString = "https://api.weibo.com/oauth2/access_token"
        // 请求参数
        let params = [
            "client_id": WB_APPKEY,
            "client_secret": WB_SECRET,
            "grant_type": "authorization_code",
            "code": code,
            "redirect_uri": WB_REGIRECTURI
        ]
        FXNetworkTools.sharedTool.requset(FXRequestMethod.POST, urlString: urlString, parameters: params) { (response, error) -> () in
            if error != nil{
                completed(isSuccess: false)
            }
            guard let dict = response as? [String: AnyObject] else{
                print("返回的不是字典")
                completed(isSuccess: false)
                return
            }
            // 字典转模型
            let account = FXUserAccount(dict: dict)
            // 加载个人信息
            self.loadUserAccount(account, completed: completed)
        }
    }
    
    
    
    // 获取用户信息
    func loadUserAccount(account: FXUserAccount, completed: (isSuccess: Bool) ->()){
        // 请求地址
        let urlString = "https://api.weibo.com/2/users/show.json"
        // 请求参数：http://open.weibo.com/wiki/2/users/show
        let params = [
            "access_token": account.access_token!,
            "uid": account.uid!
        ]
        // 发送网络请求
        FXNetworkTools.sharedTool.requset(urlString: urlString, parameters: params) { (response, error) -> () in
            if error != nil{
                completed(isSuccess: false)
            }
            // 获取用户信息
            guard let dict = response as? [String: AnyObject] else{
                completed(isSuccess: false)
                return
            }
            // 从获取到的用户信息中 把头像，和昵称保存到 account（用户信息） 中
            account.avatar_large = dict["avatar_large"] as? String
            account.screen_name = dict["screen_name"] as? String
            // 到这一步，就代表登录完成，用户信息全部获取完成
            self.userAccount = account
            // 归档
           self.saveAccount(account)
            // 切换控制器
            completed(isSuccess: true)
        }
    }
}



extension FXUserAccountViewModel{
    // 归档
    func saveAccount(account: FXUserAccount){
         NSKeyedArchiver.archiveRootObject(account, toFile: archivePath)
    }
    // 解档
    func getUserAccoun() ->FXUserAccount? {
        return NSKeyedUnarchiver.unarchiveObjectWithFile(archivePath) as? FXUserAccount
    }

}
